home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / gui / prcgntn1.lha / Precognition / source / CycleGadget.c < prev    next >
C/C++ Source or Header  |  1992-12-23  |  8KB  |  325 lines

  1. #include <stdio.h>
  2. #include "CycleGadget.h"
  3. #include "CycleGadgetClass.h"
  4. #include "BoolGadgetClass.h"
  5. #include "precognition.h"
  6. #include "minmax.h"
  7. #include "AmigaMem.h"
  8. #include <proto/exec.h>
  9. #include <proto/graphics.h>
  10. #include <proto/intuition.h>
  11.  
  12.  
  13. void CycleGadget_CleanUp( CycleGadget *self )
  14. {
  15.    Afree( self->bg.BoxBorder->BottomRight.NextBorder );
  16.    self->bg.BoxBorder->BottomRight.NextBorder = NULL; 
  17.    StringList_CleanUp( &self->sl );
  18. }
  19.  
  20.  
  21. Point CycleGadget_AskSize( CycleGadget *self,
  22.                             PIXELS       Width,
  23.                             PIXELS       Height )
  24. {
  25.    Point size;
  26.  
  27.    size.y = 14;
  28.    size.x = MAX( Width, 32 );
  29.  
  30.    return size;
  31. }
  32.  
  33.  
  34.  
  35. USHORT CycleGadget_ClaimEvent( CycleGadget   *self,
  36.                                IntuiMessage  *event )
  37. {
  38.    USHORT response = 0;
  39.  
  40.    switch (event->Class)
  41.    {
  42.       case REFRESHWINDOW:
  43.          response = RESPONDED;
  44.          break;
  45.  
  46.       case GADGETUP:
  47.          if (event->IAddress == (void*) &self->bg.g)
  48.          {
  49.             response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
  50.          }
  51.          break;
  52.  
  53.    }
  54.  
  55.    return response;
  56. }
  57.  
  58.  
  59. LONG CycleGadget_Value( CycleGadget *self )
  60. {
  61.    return (LONG) self->bg.state;
  62. }
  63.  
  64. LONG CycleGadget_SetValue( CycleGadget *self,
  65.                            LONG         selection )
  66. {
  67.    USHORT s;
  68.  
  69.    s = MIN( selection, self->sl.nEntries );
  70.    s = MAX( s, 0 );
  71.  
  72.    self->bg.state = s;
  73.  
  74.    Forbid();
  75.    self->Format.IText = self->sl.Entries[s];
  76.    Permit();
  77.  
  78.    return (LONG) s;
  79. }
  80.  
  81. void CycleGadget_Render( CycleGadget *self,
  82.                          RastPort    *RPort )
  83. {
  84.    PIXELS xmin, xmax, ymin, ymax;
  85.  
  86.    xmin = self->bg.Location.x + 2;
  87.    ymin = self->bg.Location.y + 2;
  88.    xmax = xmin + self->bg.Size.x - 4;
  89.    ymax = ymin + self->bg.Size.y - 4;
  90.    SetAPen( RPort, self->bg.Pens.BackPen );
  91.    SetDrMd( RPort, JAM1 );
  92.    RectFill( RPort, xmin, ymin, xmax, ymax );
  93.  
  94.    EmbossedGadget_Render( &self->bg, RPort );
  95. }
  96.  
  97.  
  98. USHORT CycleGadget_Respond( CycleGadget  *self,
  99.                             IntuiMessage *event )
  100. {
  101.    USHORT     response = 0;
  102.    Window    *window;
  103.    USHORT     selection;
  104.  
  105.    switch (event->Class)
  106.    {
  107.       case REFRESHWINDOW:
  108.          response = RESPONDED;
  109.          break;
  110.  
  111.       case GADGETUP:
  112.          if (event->IAddress == (void*) &self->bg.g)
  113.          {
  114.             window = event->IDCMPWindow;
  115.  
  116.             selection = self->bg.state + 1;
  117.  
  118.             if (selection == self->sl.nEntries)
  119.                selection = 0;
  120.  
  121.             SetValue( self, selection );
  122.             Render( self, window->RPort );
  123.  
  124.             response = RESPONDED | CONSUMED_EVENT | CHANGED_STATE;
  125.          }
  126.          break;
  127.  
  128.    }
  129.  
  130.    return response;
  131. }
  132.  
  133.  
  134. #ifdef BUILDER
  135. #include "BuilderMethods.h"
  136. #include "GraphicObject_Builder.h"
  137. #include "CycleGadget_builder.h"
  138. #include "CycleGadget_coder.h"
  139. #include <string.h>
  140.  
  141. CycleGadget *CycleGadget_New( CycleGadget *self )
  142. {
  143.    CycleGadget *cycle = NULL;
  144.    USHORT i;
  145.  
  146.  
  147.    char **choices;
  148.    
  149.    if (cycle = (CycleGadget *) Amalloc(sizeof(CycleGadget)))
  150.    {
  151.       StringList *sl; 
  152.  
  153.       sl = &(self->sl);
  154.     
  155.       choices = (char**) Acalloc( sizeof(char*), sl->nEntries+1 );
  156.  
  157.       for (i=0; i<sl->nEntries; i++)
  158.       {
  159.          choices[i] = sl->Entries[i];
  160.       }
  161.       
  162.       choices[sl->nEntries] = NULL;
  163.  
  164.       CycleGadget_Init(  cycle,
  165.                          self->bg.Location.x, self->bg.Location.y,
  166.                          self->bg.Size.x,     self->bg.Pens,
  167.                          Title(self),         choices );
  168.  
  169.       GiveItAName( cycle );
  170.  
  171.       Afree(choices);
  172.    }
  173.  
  174.    return cycle;
  175. }
  176.  
  177.  
  178. struct BuilderMethods CycleGadget_bm;
  179.  
  180. #endif
  181.  
  182.  
  183. BOOL CycleGadget_elaborated = FALSE;
  184.  
  185. struct ValuatorClass CycleGadget_Class;
  186.  
  187. void CycleGadgetClass_Init( struct ValuatorClass *class )
  188. {
  189.    BoolGadgetClass_Init( class );
  190.    class->isa         = BoolGadgetClass();
  191.    class->ClassName   = "CycleGadget";
  192.  
  193. /* -------- Commented-out methods are inherited ----------------*/
  194.    class->CleanUp     = CycleGadget_CleanUp;
  195.    class->AskSize     = CycleGadget_AskSize;
  196.    class->SizeFlags   = GraphicObject_SizeFlagsX;
  197.    class->Render      = CycleGadget_Render;
  198.    class->ClaimEvent  = CycleGadget_ClaimEvent;
  199.    class->Respond     = CycleGadget_Respond;
  200.    class->Value       = CycleGadget_Value;
  201.    class->SetValue    = CycleGadget_SetValue;
  202. /*   class->SetTitle    = EmbossedGadget_SetTitle;*/
  203.  
  204. #ifdef BUILDER
  205.    go_InitBuilderMethods( &CycleGadget_bm );
  206.    class->BuilderMethods = &CycleGadget_bm;
  207.    CycleGadget_bm.New       = CycleGadget_New;
  208.    CycleGadget_bm.PropEdit  = CycleGadget_PropEdit;
  209.    CycleGadget_bm.WriteCode = CycleGadget_WriteCode;
  210.  
  211. #endif
  212.  
  213. }
  214.  
  215.  
  216. struct ValuatorClass *CycleGadgetClass( void )
  217. {
  218.    if (! CycleGadget_elaborated)
  219.    {
  220.       CycleGadgetClass_Init( &CycleGadget_Class );
  221.       CycleGadget_elaborated = TRUE;
  222.    }
  223.  
  224.    return &CycleGadget_Class;
  225. }
  226.  
  227.  
  228. WORD Cycle_BrightLinePoints[] = { 15,1, 15,12 };
  229. WORD Cycle_DarkLinePoints[]   = { 14,1, 14,12 };
  230. WORD Cycle_ArrowPoints[] =
  231.   { 10,3, 10, 7, 12,5, 7,5, 9,7, 9,2,  5,2,
  232.      4,3,  4,10,  5,3, 5,11, 9,11, 9,10, 10,10 };
  233.  
  234.  
  235. typedef struct CycleBorder
  236.    {
  237.       Border BrightLine;
  238.       Border DarkLine;
  239.       Border Arrow;
  240.    } CycleBorder;
  241.  
  242.  
  243. CycleBorder *CycleBorder_New( pcg_3DPens Pens )
  244. {
  245.    CycleBorder *border;
  246.  
  247.    border = (CycleBorder *) Acalloc( 1, sizeof(CycleBorder) );
  248.    border->BrightLine.LeftEdge   = 0;
  249.    border->BrightLine.TopEdge    = 0;
  250.    border->BrightLine.FrontPen   = Pens.BrightPen;
  251.    border->BrightLine.BackPen    = Pens.BackPen;
  252.    border->BrightLine.DrawMode   = JAM1;
  253.    border->BrightLine.Count      = 2;
  254.    border->BrightLine.XY         = Cycle_BrightLinePoints;
  255.    border->BrightLine.NextBorder = &border->DarkLine;
  256.  
  257.    border->DarkLine.LeftEdge   = 0;
  258.    border->DarkLine.TopEdge    = 0;
  259.    border->DarkLine.FrontPen   = Pens.DarkPen;
  260.    border->DarkLine.BackPen    = Pens.BackPen;
  261.    border->DarkLine.DrawMode   = JAM1;
  262.    border->DarkLine.Count      = 2;
  263.    border->DarkLine.XY         = Cycle_DarkLinePoints;
  264.    border->DarkLine.NextBorder = &border->Arrow;
  265.  
  266.    border->Arrow.LeftEdge   = 0;
  267.    border->Arrow.TopEdge    = 0;
  268.    border->Arrow.FrontPen   = Pens.FrontPen;
  269.    border->Arrow.BackPen    = Pens.BackPen;
  270.    border->Arrow.DrawMode   = JAM1;
  271.    border->Arrow.Count      = 14;
  272.    border->Arrow.XY         = Cycle_ArrowPoints;
  273.    border->Arrow.NextBorder = NULL;
  274.  
  275.    return border;
  276. }
  277.  
  278. void CycleGadget_Init( CycleGadget  *self,
  279.                        PIXELS        LeftEdge,
  280.                        PIXELS        TopEdge,
  281.                        PIXELS        Width,
  282.                        pcg_3DPens    Pens,
  283.                        char         *label,
  284.                        char        **Choices )
  285. {
  286.    Point     size;
  287.    AlignInfo ainfo;
  288.  
  289.    self->bg.isa  = CycleGadgetClass();
  290.    size          = AskSize( self, Width, 0 );
  291.  
  292.    BoolGadget_Init( &self->bg, LeftEdge, TopEdge, size.x, size.y,
  293.                         Pens, NULL );
  294.  
  295.    ainfo = TextAlignment(self);
  296.    SetTextAlignment( self, tx_OUTSIDE | tx_LEFT | tx_YCENTER,
  297.       ainfo.Xpad, ainfo.Ypad );
  298.  
  299.  
  300.    self->bg.isa     = CycleGadgetClass();
  301.    self->bg.g.Flags = GADGHCOMP;
  302.    self->bg.BoxBorder->BottomRight.NextBorder =
  303.       (Border *) CycleBorder_New(Pens);
  304.  
  305.  
  306.    StringList_Init( &self->sl, FALSE );
  307.  
  308.    self->bg.state               = 0;
  309.    self->bg.LabelText.NextText  = &self->Format;
  310.  
  311.    self->Format.FrontPen  = Pens.FrontPen;
  312.    self->Format.BackPen   = Pens.BackPen;
  313.    self->Format.DrawMode  = JAM1;
  314.    self->Format.LeftEdge  = 20;
  315.    self->Format.TopEdge   = 3;
  316.    self->Format.ITextFont = &pcg_Topaz80;
  317.    self->Format.IText     = (Choices ? Choices[0] : NULL);
  318.    self->Format.NextText  = NULL;
  319.  
  320.    if (Choices)
  321.       StringList_AddStrings( &self->sl, Choices, 0 );
  322.   
  323.    SetTitle( self, label );
  324. }
  325.